修改Android打包apk的名字和目录 |
您所在的位置:网站首页 › android apk安装目录 › 修改Android打包apk的名字和目录 |
app打包生成apk后通常需要进行备份,但是要区分好哪个apk是什么版本的、什么时候打包的,以方便以后区分使用。 最开始的想法是把版本号、创建时间这些加在apk文件名上即可,但是公司要求apk使用一个固定的名称,那我怎么保存版本号信息啊,后来想到可以加一个文件夹,在文件夹名字上加入这些信息即可,示例如一: app/build.gradle: import java.text.SimpleDateFormat android { //release版本输出位置与文件名配置 applicationVariants.all { variant -> variant.outputs.all { output -> if (buildType.name == 'release') { //只处理生产版本 def createTime = new Date().format("yyyy-MM-dd-kkmmss", TimeZone.getTimeZone("GMT+08:00")) def dirName = "ball_v${defaultConfig.versionName}_${defaultConfig.versionCode}_$createTime" def apkDir = rootProject.file("apk/$dirName") if (!apkDir.exists()) { apkDir.mkdirs() } variant.packageApplicationProvider.get().outputDirectory = apkDir // 指定apk的输出位置 output.outputFileName = "Railway_4G_Platform_ball.apk" // 指定输出文件名 } } } }这里省略了很多其它的信息,只贴关键代码,导包是要放在文件的最前面,关键代码要是写在android节点下的。 上面是以前的写法了,现在(今天是2024年03月07日)最新版本Android Studio已经使用了更新的Gradle,而且新创建的项目也默认使用Kotlin作为gradle的脚本语言了,那肯定是要追随官方的脚步啊,于是想把上面的配置翻译成Kotlin的版本,即可发现已经用不了,新版本的Gradle已经不允许那种方式来修改apk的名称了,于是又找了新的方式,感觉新的方式还更专业一些,如下: import java.time.LocalDateTime import java.time.format.DateTimeFormatter android { afterEvaluate { tasks.named("assembleRelease") { finalizedBy("copyAndRenameApkTask") } } } val copyAndRenameApkTask by tasks.registering(Copy::class) { val config = project.android.defaultConfig val versionName = config.versionName val versionCode = config.versionCode val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HHmmss") val createTime = LocalDateTime.now().format(formatter) val destDir = File(rootDir, "apkBackup/big_data_v${versionName}_${versionCode}_$createTime") from("build/outputs/apk/release/app-release.apk") into(destDir) rename { _ -> "Railway_4G_Platform_big_data.apk" } }与前面的修改方式对比: 前面的是直接修改了打包apk的位置和apk的文件名。用的是groovy语言。后面的是打包后apk后复制该apk到指定的位置并进行重命名。用的是kotlin语言,平时写代码也是用Kotlin了,所以使用kotlin还是感觉比较亲切的。打包两个版本的apk看一效果: 我们公司的apk在上传到公司服务器时,除了上传apk外,还需要填写apk的相关信息,比如包名、版本号这些,同时也允许通过上传一个配置文件来指定这些信息,像这样每次打包每次要修改这些信息也是挺烦人的,都说Gradle可以完成自动化的事情,于是让Gradle帮我生成一个不就行了吗,实现这个很简单,在之前的复制重命名的任务中添加生成配置文件的代码即可,如下: val copyAndRenameApkTask by tasks.registering(Copy::class) { val config = project.android.defaultConfig val versionName = config.versionName val versionCode = config.versionCode val applicationId = config.applicationId val timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HHmmss") val dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd-HHmmss") val now = LocalDateTime.now() val createTime = now.format(timeFormatter) val createDate = now.format(dateFormatter) val destDir = File(rootDir, "apkBackup/big_data_v${versionName}_${versionCode}_$createTime") from("build/outputs/apk/release/app-release.apk") into(destDir) rename { _ -> "Railway_4G_Platform_big_data.apk" } doLast { File(destDir, "app上传配置.txt").outputStream().bufferedWriter().use { it .appendLine("版本号:${versionCode}") .appendLine("版本名称:${versionName}") .appendLine("软件名称:掌上运维") .appendLine("软件包名:${applicationId}") .appendLine("版本说明:说明") .appendLine("发布时间:${createDate}") .appendLine("发布状态:1") .appendLine("更新类型:0") // 0-询问更新,1-强制更新到此版本 .appendLine("强制更新标记:0") // 0-此版本无需强制更新,1-此版本不能使用,必须更新(此参数始终传0) .appendLine("软件分类:1") .appendLine("业务分类:1") .appendLine("软件级别:1") .append("备注:") } } }效果如下: 另外,还可以把git的提交记录添加到文件夹中,以便可以清楚的知道打包的时候git的当时提交版本是什么,所以,在打包的时候一定要先把所有代码提交了再打包,核心代码如下: import java.io.ByteArrayOutputStream fun exec(command: String): String { val outputStream = ByteArrayOutputStream() val process = Runtime.getRuntime().exec(command) process.inputStream.copyTo(outputStream) return outputStream.toString().trim() } val copyAndRenameApkTask by tasks.registering(Copy::class) { 。。。 val gitHash = exec("git rev-parse --short HEAD") val destDir = File(rootDir, "apkBackup/big_data_v${versionName}_${versionCode}_${createTime}_$gitHash") 。。。 }另外,由groovy转到kotlin带来的一些改变这里也一并记录一下: 签名配置: android { signingConfigs { getByName("debug") { storeFile = file("123456.jks") storePassword = "123456" keyAlias = "key0" keyPassword = "123456" } create("release") { storeFile = file("123456.jks") storePassword = "123456" keyAlias = "key0" keyPassword = "123456" } } buildTypes { debug { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") signingConfig = signingConfigs.getByName("debug") } release { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") signingConfig = signingConfigs.getByName("release") } } }注意:这里signingConfigs中debug的配置要使用getByName,不能使用create,因为debug这个配置是默认就会创建的,如果你再创建就提示已经存在,所以只能用getByName。 在libs目录中添加jar或aar时的配置: implementation(fileTree(mapOf("include" to arrayOf("*.jar", "*.aar"), "dir" to "libs")))对比原来Groovy的配置: implementation(fileTree(includes: ["*.jar", "*.aar"], dir: "libs"))仓库设置: maven { isAllowInsecureProtocol = true // 仓库默认不允许使用非https协议,所以这里设置为允许 url = uri("http://192.168.1.251:8081/content/repositories/android_repositories/") } maven { url = uri("https://jitpack.io") }对比原来Groovy的配置: maven { allowInsecureProtocol = true // 仓库默认不允许使用非https协议,所以这里设置为允许 url 'http://192.168.1.251:8081/content/repositories/android_reposito } maven { url 'https://jitpack.io' } // 用于:RxPermissions |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |